/**
定义: 
通过 origin_of 转换得到的类型是一个去除 const/volatle/引用 的类型
如果使用 with_propcast 参数，如下
using foo_t = origin_of<origin_t, with_propcast>;
origin_of<> 内部会先考虑判断 origin_t 是否是一个属性类型，如果是属性，则转换成它对应的元素类型
然后再移除 const/volatle/引用 修饰

 */
#ifndef xpack_meta_origin_of
#define xpack_meta_origin_of
#pragma push_macro("xuser")
#undef  xuser
#define xuser mixc::meta_origin_of::inc
#include"configure/switch.hpp"
#include"define/base_type.hpp"
#include"macro/xexport.hpp"
#include"meta/prop_type.hpp"
#include"meta/remove_ref.hpp"
#include"meta/remove_const.hpp"
#include"meta/remove_volatile.hpp"
#pragma pop_macro("xuser")

namespace mixc::meta_origin_of{
    template<class type_t, ignore_propcast_t ignore_propcast_v = ignore_propcast>
    using origin_of =
        inc::remove_ref<
            inc::remove_volatile<
                inc::remove_const<
                    inc::prop_type<
                        type_t, ignore_propcast_v
                    >
                >
            >
        >;
}

#endif

xexport(mixc::meta_origin_of::origin_of)
